#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
GitLab TimescaleDB 使用示例

展示如何使用 gitlab_timescale 包的各种功能：
1. 基本配置和连接
2. 数据收集和同步
3. 数据分析和报告
4. Legacy 模块使用
"""

import sys
from datetime import datetime, timedelta, date
from pathlib import Path

from loguru import logger

# 添加包路径
sys.path.insert(0, str(Path(__file__).parent.parent))

try:
    from gitlab_timescale import (
        get_config,
        setup_logging,
        TimescaleDBManager,
        GitLabTimescaleCollector,
        GitLabTimescaleAnalyzer,
        GitLabCommitsAnalyzer,
        GitLabReposFetcher,
        GitLabUsersCollector
    )
    from gitlab_timescale.collector import SyncConfig
    from gitlab_timescale.analyzer import AnalysisConfig
except ImportError:
    # 如果包导入失败，尝试直接导入模块
    from gitlab_timescale.config import get_config, setup_logging
    from gitlab_timescale.models import TimescaleDBManager
    from gitlab_timescale.collector import GitLabTimescaleCollector, SyncConfig
    from gitlab_timescale.analyzer import GitLabTimescaleAnalyzer, AnalysisConfig
    from gitlab_timescale.legacy import GitLabCommitsAnalyzer, GitLabReposFetcher, GitLabUsersCollector


def example_basic_setup():
    """示例1: 基本设置和配置"""
    logger.info("=== 示例1: 基本设置和配置 ===")

    # 获取配置
    config = get_config()
    logger.info(f"GitLab URL: {config.gitlab.url}")
    logger.info(f"数据库连接: {config.database.connection_string[:50]}...")

    # 设置日志
    setup_logging(config.log)

    # 初始化数据库管理器
    db_manager = TimescaleDBManager(
        connection_string=config.database.connection_string,
        min_connections=config.database.min_connections,
        max_connections=config.database.max_connections
    )

    # 测试数据库连接
    if db_manager.test_connection():
        logger.info("✅ 数据库连接成功")
    else:
        logger.error("❌ 数据库连接失败")
        return None

    return config, db_manager


def example_data_collection(config, db_manager):
    """示例2: 数据收集和同步"""
    logger.info("\n=== 示例2: 数据收集和同步 ===")

    # 创建收集器
    collector = GitLabTimescaleCollector(
        gitlab_url=config.gitlab.get_default_instance().url,
        access_token=config.gitlab.get_default_instance().access_token,
        db_manager=db_manager
    )

    # 测试GitLab连接
    if not collector.test_connection():
        logger.error("❌ GitLab连接失败")
        return

    logger.info("✅ GitLab连接成功")

    # 配置同步参数
    sync_config = SyncConfig(
        full_sync=False,  # 增量同步
        start_time=datetime.now() - timedelta(days=7),  # 最近7天
        batch_size=50,
        max_workers=3,
        include_merge_commits=True,
        projects_filter=None  # 同步所有项目
    )

    logger.info(f"同步配置: {sync_config}")

    # 执行同步（这里只是演示，实际使用时取消注释）
    # results = collector.sync_all_projects(sync_config)
    # logger.info(f"同步结果: {results}")

    logger.info("💡 提示: 取消注释上面的代码来执行实际同步")


def example_data_analysis(db_manager):
    """示例3: 数据分析和报告"""
    logger.info("\n=== 示例3: 数据分析和报告 ===")

    # 创建分析器
    analyzer = GitLabTimescaleAnalyzer(db_manager)

    # 配置分析参数
    analysis_config = AnalysisConfig(
        start_date=date.today() - timedelta(days=30),  # 最近30天
        end_date=date.today(),
        project_ids=None,  # 分析所有项目
        include_merge_commits=True
    )

    logger.info(f"分析配置: {analysis_config}")

    # 获取用户贡献统计
    try:
        user_stats = analyzer.get_user_contribution_stats(analysis_config)
        logger.info(f"\n📊 用户贡献统计 (前5名):")
        for i, user in enumerate(user_stats[:5]):
            logger.info(f"  {i + 1}. {user.get('author_name', 'Unknown')}: {user.get('total_commits', 0)} 个提交")
    except Exception as e:
        logger.warning(f"⚠️ 获取用户统计失败: {e}")

    # 获取项目活跃度统计
    try:
        project_stats = analyzer.get_project_activity_stats(analysis_config)
        logger.info(f"\n📈 项目活跃度统计 (前5名):")
        for i, project in enumerate(project_stats[:5]):
            logger.info(
                f"  {i + 1}. {project.get('project_name', 'Unknown')}: {project.get('total_commits', 0)} 个提交")
    except Exception as e:
        logger.warning(f"⚠️ 获取项目统计失败: {e}")

    # 生成汇总报告
    try:
        report = analyzer.generate_summary_report(analysis_config)
        if 'error' not in report:
            summary = report.get('summary', {})
            logger.info(f"\n📋 汇总报告:")
            logger.info(f"  总贡献者数: {summary.get('total_contributors', 0)}")
            logger.info(f"  总项目数: {summary.get('total_projects', 0)}")
            logger.info(f"  总提交数: {summary.get('total_commits', 0)}")
            logger.info(f"  总代码变更: {summary.get('total_changes', 0)}")
        else:
            logger.warning(f"⚠️ 生成报告失败: {report['error']}")
    except Exception as e:
        logger.warning(f"⚠️ 生成报告异常: {e}")


def example_legacy_modules(config):
    """示例4: Legacy 模块使用"""
    logger.info("\n=== 示例4: Legacy 模块使用 ===")

    # 使用原有的提交分析器
    commits_analyzer = GitLabCommitsAnalyzer(
        access_token=config.gitlab.get_default_instance().access_token,
        gitlab_url=config.gitlab.url
    )

    logger.info("✅ GitLab提交分析器已创建")

    # 使用原有的仓库获取器
    repos_fetcher = GitLabReposFetcher(
        access_token=config.gitlab.get_default_instance().access_token,
        gitlab_url=config.gitlab.get_default_instance().url
    )

    logger.info("✅ GitLab仓库获取器已创建")

    # 使用原有的用户收集器
    users_collector = GitLabUsersCollector(
        gitlab_url=config.gitlab.get_default_instance().url,
        access_token=config.gitlab.get_default_instance().access_token
    )

    logger.info("✅ GitLab用户收集器已创建")

    # 测试连接
    if users_collector.test_connection():
        logger.info("✅ 用户收集器连接测试成功")
    else:
        logger.error("❌ 用户收集器连接测试失败")

    # 获取项目列表示例
    try:
        projects = repos_fetcher.get_all_projects(per_page=5)  # 只获取5个项目作为示例
        logger.info(f"\n📁 获取到 {len(projects)} 个项目:")
        for project in projects:
            logger.info(f"  - {project.get('name', 'Unknown')} (ID: {project.get('id', 'N/A')})")
    except Exception as e:
        logger.warning(f"⚠️ 获取项目列表失败: {e}")


def example_database_operations(db_manager):
    """示例5: 数据库操作"""
    logger.info("\n=== 示例5: 数据库操作 ===")

    # 获取项目统计
    try:
        project_stats = db_manager.get_project_branch_stats()
        logger.info(f"\n📊 项目分支统计 (前5名):")
        for i, stat in enumerate(project_stats[:5]):
            logger.info(
                f"  {i + 1}. 项目 {stat.get('project_id', 'N/A')}: {stat.get('total_branches', 0)} 个分支, {stat.get('total_commits', 0)} 个提交")
    except Exception as e:
        logger.warning(f"⚠️ 获取项目统计失败: {e}")

    # 获取用户贡献统计
    try:
        user_stats = db_manager.get_user_contribution_stats()
        logger.info(f"\n👥 用户贡献统计 (前5名):")
        for i, stat in enumerate(user_stats[:5]):
            logger.info(f"  {i + 1}. {stat.get('author_name', 'Unknown')}: {stat.get('total_commits', 0)} 个提交")
    except Exception as e:
        logger.warning(f"⚠️ 获取用户统计失败: {e}")

    # 获取每日活跃度统计
    try:
        daily_stats = db_manager.get_daily_activity_stats()
        logger.info(f"\n📅 每日活跃度统计 (最近5天):")
        for i, stat in enumerate(daily_stats[:5]):
            logger.info(
                f"  {stat.get('date', 'N/A')}: {stat.get('total_commits', 0)} 个提交, {stat.get('active_users', 0)} 个活跃用户")
    except Exception as e:
        logger.warning(f"⚠️ 获取每日统计失败: {e}")


def main():
    """主函数"""
    logger.info("🚀 GitLab TimescaleDB 包使用示例")
    logger.info("=" * 50)

    try:
        # 基本设置
        result = example_basic_setup()
        if result is None:
            logger.error("❌ 基本设置失败，退出示例")
            return

        config, db_manager = result

        # 数据收集示例
        example_data_collection(config, db_manager)

        # 数据分析示例
        example_data_analysis(db_manager)

        # Legacy模块示例
        example_legacy_modules(config)

        # 数据库操作示例
        example_database_operations(db_manager)

        logger.info("\n✅ 所有示例执行完成！")
        logger.info("\n💡 提示:")
        logger.info("  1. 确保已正确配置 .env 文件")
        logger.info("  2. 确保数据库已初始化 (运行 python sync_script.py --init-db)")
        logger.info("  3. 执行数据同步后可以看到更多统计数据")

    except KeyboardInterrupt:
        logger.info("\n⏹️ 用户中断执行")
    except Exception as e:
        logger.error(f"\n❌ 执行示例时发生异常: {e}")
        import traceback
        traceback.print_exc()


if __name__ == '__main__':
    main()
